;----------------   Loader    --------------
;loader在内存中的起始地址
LOADER_BASE_ADDR 	    equ 0x900
;loader在磁盘上的开始块
LOADER_START_SECTOR 	equ 0x2
; 页目录的存放地址
PAGE_DIR_TABLE_POS      equ 0x100000
;----------------   Kernel    --------------
; kernel的elf文件地址  
KERNEL_BIN_BASE_ADDR    equ 0x70000
; kernel在磁盘中的扇区号
KERNEL_START_SECTOR     equ 0x9
; kernel入口地址
KERNEL_ENTRY_ADDR       equ 0xc0001500
; 进入内核后sp的指针地址
KERNEL_STACK_POINTER    equ 0xc009f000

;----------------   描述符相关    --------------
;gdt描述符属性
DESC_G_4K		        equ	1_000_0000_0000_0000_0000_0000b	;段描述格式符中bit23是G位，如果为1则段界限粒度大小为4k,如果为0则段界限粒度大小为1
DESC_D_32		        equ	1_00_0000_0000_0000_0000_0000b	;段描述格式符中bit22是D/B位，用来指示有效地址及操作数的大小，若为0表明为16位，若为1表明为32位
DESC_L			        equ	0_0_0000_0000_0000_0000_0000b	;段描述格式符中bit21是L位，用来指示是否为64位代码段，L为1表示64位，L为0表示32位，对于我们32位系统来说，这个位是保留位
DESC_AVL		        equ	0_0000_0000_0000_0000_0000b	;段描述格式符中bit20是保留位，cpu硬件没有使用，留给操作系统软件使用的位，这里我们先保留置0

DESC_LIMIT_CODE2	    equ	1111_0000_0000_0000_0000b
DESC_LIMIT_DATA2	    equ	DESC_LIMIT_CODE2
DESC_LIMIT_VIDEO2	    equ	0000_0000_0000_0000_0000b
DESC_P			        equ	1_000_0000_0000_0000b		;段描述格式符中bit15是P为，present,译为段是否存在内存中，如果P为1,则存在，如果P为0,则不存在，这个位主要是用于与磁盘交换段，即长时间不用的段先放到磁盘当中。
;bit13～14位用于DPL字段，即描述符特权级
DESC_DPL_0		        equ	00_0_0000_0000_0000b
DESC_DPL_1		        equ	01_0_0000_0000_0000b
DESC_DPL_2		        equ	10_0_0000_0000_0000b
DESC_DPL_3		        equ	11_0_0000_0000_0000b

DESC_S_CODE		        equ	1_0000_0000_0000b
DESC_S_DATA		        equ	DESC_S_CODE
DESC_S_SYS		        equ	0_0000_0000_0000b

;bit11～8位用于type字段
;对于代码段来说，他们是
;bit11		bit10		bit9		bit8
;x		r		c		a
;对于数据段来说，他们是
;x		e		w		a
;a由cpu来设置为1,由操作系统来清0,此位可用于判断该段在某段时间内被访问的次数，若访问次数很少，可考虑放入磁盘进行交换
;e用来表示段的扩展方向，若e为0表示向上扩展，地址越来越高，若e为1表示向下扩展，地址越来越低
;c用来表示该段是否为一致性代码，c为0时为非一致性代码，c为1时为一致性代码
;w用来表示该段是否可写，w为1表示可写，w为0表示不可写
;r用来表示该段是否可读，r为1表示可读，r为0表示不可读
;x表示该段是否可执行，x为1即可执行，x为0即不可执行
DESC_TYPE_CODE		    equ	1000_0000_0000b	;可执行，不可读，非一致性代码，未被cpu访问过
DESC_TYPE_DATA		    equ	0010_0000_0000b	;不可执行，可写入，向上扩展，未被cpu访问过


DESC_CODE_HIGH4		    equ	(0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0X00
DESC_DATA_HIGH4         equ	(0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_DATA2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0X00
DESC_VIDEO_HIGH4        equ	(0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x0b

;----------------   选择子相关    --------------
;选择子属性 bit0~bit1用于描述请求特权级别 bit2用来描述是全局还是局部 其余描述index
RPL0			        equ 00b
RPL1			        equ	01b
RPL2			        equ	10b
RPL3			        equ	11b
TI_GDT			        equ	0_00b
TI_LDT			        equ	1_00b


;----------------   页表相关属性    --------------
PG_P                    equ 1b
PG_RW_R	                equ 00b 
PG_RW_W	                equ 10b 
PG_US_S	                equ 000b 
PG_US_U	                equ 100b 


;----------------   ELF文件相关偏移    --------------
ELF_OF_MAGIC            equ 0
; ELF目标文件类型
; 0为未知 1为可重定位 2为可执行文件 3为动态共享文件
; 4为core文件 0xff00为特定处理器文件的扩展下边界 0xffff为上边界
ELF_OF_TYPE             equ 16
; elf目标文件所属的体系结构
; 3为EM386即INTEL 80386
ELF_OF_MACHINE          equ 18
; 版本信息
ELF_OF_VERSION          equ 20
; 用来指明操作系统运行该程序时,将控制权转交到的虚拟地址
ELF_OF_ENTRY            equ 24
; 用来指明程序头表( program header table )在文件内的字节偏移量
ELF_OF_PHOFF            equ 28
; 用来指明节头表( section header table )在文件内的字节偏移量
ELF_OF_SHOFF            equ 32
; 用来指明与处理器相关的标志
ELF_OF_FLAGS            equ 36
; 用来指明 elf header 的宇节大小
ELF_OF_EHSIZE           equ 40
; 用来指明程序头表( program header table )中每个条目( entry )的字节大小
ELF_OF_EHENTSIZE        equ 42
; ,用来指明程序头表中条目的数量
ELF_OF_PHNUM            equ 44
; 用来指明节头表( section header table )中每个条目( en町)的字节大小
ELF_OF_SHENTSIZE        equ 46
; 用来指明节头表中条目的数量
ELF_OF_SHNUN            equ 48
; 用来指明 string name table 在节头表中的索引 index
ELF_OF_SHSTMDX          equ 50

;----------------   ELF文件中程序头表中的条目    --------------
; 用来指明程序中该段的类型
; 0为忽略 1为可加载程序段 2为动态链接信息
; 3为动态加载器名称 4为一些辅助的附加信息
; 5为保留 6为程序头表
ELF_PHOF_TYPE           equ 0
; 用来指明本段在文件内的起始偏移字节
ELF_PHOF_OFFSET         equ 4
; 用来指明本段在内存中的起始虚拟地址
ELF_PHOF_VADDR          equ 8
; 保留
ELF_PHOF_PADDR          equ 12
; 用来指明本段在文件中的大小
ELF_PHOF_FILESZ         equ 16
; 用来指明本段在内存中的大小
ELF_PHOF_MEMSZ          equ 20
; 用来指明与本段相关的标志
ELF_PHOF_FLAGS          equ 24
; 用来指明本段在文件和内存中的对齐方式。如果值为 0 或 1 ,则表示不对齐
; 否则 应该是 2 幂次数。
ELF_PHOF_ALIGN          equ 30